package com.ruoyi.cc.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * Quartz 配置类（JDBC 存储模式）：注入数据源和事务管理器
 */
@Configuration
public class QuartzConfig {

    /**
     * 注入 Spring 管理的数据源（与 Spring Boot 数据源配置一致）
     */
    private final DataSource dataSource;

    // 构造函数注入数据源（Spring 自动注入配置的 dataSource）
    public QuartzConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 配置 Job 工厂：支持 Spring Bean 注入到 Job 中
     */
    @Bean
    public SpringBeanJobFactory jobFactory() {
        return new SpringBeanJobFactory();
    }

    /**
     * 配置事务管理器（Quartz 事务型存储 JobStoreTX 依赖）
     */
    @Bean
    public PlatformTransactionManager quartzTransactionManager() {
        // 使用数据源创建事务管理器（与 Spring 事务管理器一致）
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 配置 Quartz 调度器工厂（核心 Bean）：注入数据源、事务管理器、Job 工厂
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(
            SpringBeanJobFactory jobFactory,
            @Qualifier("quartzTransactionManager") PlatformTransactionManager transactionManager) {

        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();

        // 1. 注入数据源（JDBC 存储核心）
        schedulerFactory.setDataSource(dataSource);

        // 2. 注入事务管理器（支持任务执行的事务）
        schedulerFactory.setTransactionManager(transactionManager);

        // 3. 注入 Job 工厂（支持 Spring Bean 注入到 Job）
        schedulerFactory.setJobFactory(jobFactory);

        // 4. 配置 Quartz 属性（也可通过 application.yml 配置，此处优先级更高）
        Properties quartzProperties = new Properties();
        // 集群模式（单机设为 false）
        quartzProperties.setProperty("org.quartz.jobStore.isClustered", "false");
        // 集群节点心跳间隔（集群模式生效）
        quartzProperties.setProperty("org.quartz.jobStore.clusterCheckinInterval", "10000");
        schedulerFactory.setQuartzProperties(quartzProperties);

        // 5. 启动时延迟初始化（避免应用启动时冲突）
        schedulerFactory.setStartupDelay(1);

        // 6. 允许覆盖已存在的任务（更新任务时使用）
        schedulerFactory.setOverwriteExistingJobs(true);

        return schedulerFactory;
    }
}